@extends('bootstrap')
@section('title','Blob难点解析')
@section('content')
    <h3>不能使用addslashes函数</h3>
    <p>
        往MYSQL数据库写入二进制数据（例如图片数据）的时候，大家都会在网上去搜索，搜索到的代码中通常都会在写入之前，对写入的二进制数据进行在addslashes函数的变换。当使用Eloquent
        ORM进行二进制写入的时候，不能使用addslashes函数。使用了之后读出之后的文件和原始格式不一样，无法还原，这非常重要。
    </p>
    <h3>二进制数据比较大的时候写入失败问题</h3>
    <p>
        这个问题分为两段。第一段是客户端传数据到服务器中失败，这个问题通常都是因为HTTP包的参数设置的问题。通常限定的是上传文件大小。这个问题主要通过设置php.ini文件来解决。具体涉及到的参数如下：

    <dl >
        <dt>max_execution_time = 0</dt>
        <dd>页面最大执行时间，默认是30（秒），修改为0，表示没有限制</dd>
        <dt>post_max_size = 70M</dt>
        <dd>POST数据包的最大长度。默认是2M，显然要上传大于2M，就会中断。我修改为70M。</dd>
        <dt>upload_max_filesize = 64M</dt>
        <dd>上传文件最大大小，默认是8M，我修改为64M。另外要说明的是,post_max_size 大于 upload_max_filesize 为佳。</dd>
        <dt>memory_limit = 512M</dt>
        <dd>pho能分配的最大内存限定。如果遇到报内存不足的错误，可以修改这个选项。如果设置为0表示不限制。</dd>
    </dl>

    第二段是数据传入到服务器端了，但是写入数据库的时候出错。常见的错误如下：

    <dl>
        <dt>报错:Mysql Server has gone away</dt>
        <dd>这是因为写入过程时间太长，而连接中断导致的问题。解决方法是修改my.ini文件中的max_allowed_packet = 64M即可</dd>
        <dt>报错：Row size too large或者内存不足</dt>
        <dd>我用的MYSQL版本是5.6.26。这是因为innodb_log_file_size = 400M这个参数设置太小导致的，官方建议是设置为你的数据表中一行数据的10倍以上。如果你的一行数据BLOB字段最大为64M的话，那么至少要设置640M以上。其他以此类推。</dd>
    </dl>

    关于这个问题的官方解释如下：
    <blockquote>
        <p>Important Change: Redo log writes for large, externally stored BLOB fields could overwrite the most recent checkpoint. The 5.6.20 patch limits the size of redo log BLOB writes to 10% of the redo log file size. The 5.7.5 patch addresses the bug without imposing a limitation. For MySQL 5.5, the bug remains a known limitation.
            As a result of the redo log BLOB write limit introduced for MySQL 5.6, innodb_log_file_size should be set to a value greater than 10 times the largest BLOB data size found in the rows of your tables plus the length of other variable length fields (VARCHAR, VARBINARY, and TEXT type fields). Failing to do so could result in “Row size too large” errors. No action is required if your innodb_log_file_size setting is already sufficiently large or your tables contain no BLOB data. (Bug #16963396, Bug #19030353, Bug #69477)
        </p>
        <footer>InnoDB Notes <cite title="Source Title">MySQL</cite></footer>
    </blockquote>


    </p>
@endsection